package com.wujie.mall.domain.pricing.strategy;

import com.wujie.mall.domain.pricing.PricingContext;
import com.wujie.mall.domain.pricing.PricingResult;

/**
 * 定价策略接口 - 策略模式
 * 
 * 定义了定价算法的通用接口，允许在运行时动态选择不同的定价策略。
 * 
 * 策略模式的应用场景：
 * 1. 会员定价策略（普通会员、VIP会员、SVIP会员）
 * 2. 促销定价策略（满减、折扣、秒杀）
 * 3. 地区定价策略（不同地区不同价格）
 * 4. 时间定价策略（节假日、工作日）
 * 
 * @author wujie
 * @since 2024-08-26
 */
public interface PricingStrategy {

    /**
     * 获取策略名称
     * @return 策略名称
     */
    String getStrategyName();

    /**
     * 获取策略描述
     * @return 策略描述
     */
    String getDescription();

    /**
     * 检查策略是否适用于给定的定价上下文
     * @param context 定价上下文
     * @return 是否适用
     */
    boolean isApplicable(PricingContext context);

    /**
     * 获取策略优先级（数值越大优先级越高）
     * @return 优先级
     */
    int getPriority();

    /**
     * 执行定价计算
     * @param context 定价上下文，包含商品信息、用户信息、订单信息等
     * @return 定价结果
     */
    PricingResult calculatePrice(PricingContext context);

    /**
     * 验证策略配置是否有效
     * @return 验证结果
     */
    default boolean validateStrategy() {
        return true;
    }

    /**
     * 获取策略的配置信息
     * @return 配置信息
     */
    default String getConfigInfo() {
        return "策略名称: " + getStrategyName() + ", 描述: " + getDescription() + ", 优先级: " + getPriority();
    }
}